/* 
	这个文件就是拦截器，在这里会实现:
		1.把可以复用的地址进行复用，省去写这么多重复的地址
		2.自动携带一些参数，有些多个请求都需要的参数可以在这写一次就够了
		3.对数据进行处理，处理完成之后再返回给要用的组件直接想要的数据
		4.请求成功并不代表功能成功了，可以在这里做个判断，后面多个组件使用的时候就不用进行重复的判断了
		5.对一些错误进行处理，友好的告知用户界面
		6.实现加载的进度条
*/

import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";

import getUid from "./getUid";

import store from "../store";

NProgress.configure({ showSpinner: false }); //设置是否有右上角转圈

const messages = {
	401: "未授权",
	403: "禁止访问",
	404: "资源找不到",
	500: "服务器错误"
};

const request = axios.create({
	baseURL: "/api",
	headers: {},
	//请求超时的时间
	timeout: 10000
});

request.interceptors.request.use((config) => {
	NProgress.start();

	//添加请求头参数，用户未登录的情况下加一个临时id
	config.headers.userTempId = getUid();

	//如果有token就要携带上token
	const token = store.state.user.token;
	if (token) {
		config.headers.token = token;
	}

	return config;
});

request.interceptors.response.use(
	(response) => {
		NProgress.done();
		if (response.data.code === 200) {
			return response.data.data;
		} else {
			return Promise.reject(response.data.message || "未知错误，请练习管理员");
		}
	},
	(e) => {
		NProgress.done();
		let message = "未知错误，请联系管理员";
		if (e.response) {
			message = messages[response.data.code];
		} else if (e.message.indexOf("timeout") > -1) {
			message = "请求超时，请检查网络";
		} else if (e.message.indexOf("Network") > -1) {
			message = "网络故障，请检查网络";
		}
		return Promise.reject(message);
	}
);

export default request;
